/*Archivo de System calls
   *Aca se colocan todas las primitivas que el Sistema operatvo puede utilizar
  */
#include "../include/kernel.h"
#include "../include/syscalls.h"
#include "../include/kasm.h"
#include "../include/defs.h"
#include "../include/int.h"
#include "../include/kc.h"
#include "../include/teclado.h"
#include "../include/strings.h"

extern buf bufTecAscii;
extern buf bufTec;				/*buffer de teclado con Scan Codes*/
extern buf bufVid;				/*buffer de video*/
extern buf * fileDesc[MAXFILES];

size_t __read(int fd, char* buffer, size_t n){
    int i=0;
    char flag;
    if(fd < MAXFILES && fd >= 0){				//verifico  que no supere la cantidad maxima de archivos abiertos
	if(buffer != NULL){
	      while(i < n)
	      {
		  if(fileDesc[fd]->offset == fileDesc[fd]->size)
		      fileDesc[fd]->offset = 0;
		  if(fileDesc[fd]->offset != fileDesc[fd]->siguiente)
		  {
		    buffer[i++]= fileDesc[fd]->buf[(fileDesc[fd]->offset)++];
		   }
		  else
		    return i;		//retrno buffer vacio
		    
	      }
	}
	else
	;  //el char ingresado no es valido
    }
    else
    ;//el File Descriptor ingresado supera a la maxima cantidad de archivos ingresados
return i;
}





size_t __write(int fd, const char* buffer, size_t n){
      int i = 0;
      
	if(fd < MAXFILES && fd >= 0){				//verifico  que no supere la cantidad maxima de archivos abiertos
	  if(buffer != NULL){
	    while(i < n){
	    switch(fd){
	      case 1:
 
		fileDesc[fd]->buf[(fileDesc[fd]->offset)++] = buffer[i++];
		fileDesc[fd]->buf[(fileDesc[fd]->offset)++] = WHITE_TXT;
		
		if(fileDesc[fd]->offset == fileDesc[fd]->size)
		{
		  fileDesc[fd]->offset = 0;
		}
		putCharVideo(buffer[i-1]); 
	      break;
	      case 0:
	      fileDesc[fd]->buf[(fileDesc[fd]->siguiente)++] = buffer[i++];
	      if(fileDesc[fd]->siguiente == fileDesc[fd]->size)
	      {
		fileDesc[fd]->siguiente = 0;
	      }
	     
	/*	print("Offset: ");
		putc('0' + fileDesc[fd]->offset, 1);
		print("\n");
		print("Siguiente: ");
		putc('0'+ fileDesc[fd]->siguiente, 1);
		print("\n");
	*/	  

	      break;
	      }
	    
	    }
	  }
	  else
	  ;//el char ingresado no es valido  
	}
	else
	;// el File Descriptor ingresado supera a la maxima cantidad que soporta el sistema

    return i;
}

